package nosql

import (
	"github.com/garyburd/redigo/redis"
	"time"
	"fmt"
	"errors"
)

var (
	// 定义常量
	RedisClient *redis.Pool
)

// 注册缓存数据库
// host 缓存地址
// user 用户名
// password 缓存密码
func Register(host, port, user, password string) {
	if "" == host {
		host = "127.0.0.1"
	}
	if "" == port {
		port = "6379"
	}
	server := host + ":" + port

	RedisClient = &redis.Pool{
		// Other pool configuration not shown in this example.
		Dial: func() (redis.Conn, error) {
			c, err := redis.Dial("tcp", server)
			if err != nil {
				fmt.Println(err.Error())
				return nil, err
			}
			if "" != password {
				if _, err := c.Do("AUTH", password); err != nil {
					c.Close()
					fmt.Println(err.Error())
					return nil, err
				}
			}
			return c, nil
		},
		MaxIdle:     50,
		MaxActive:   500,
		IdleTimeout: 600 * time.Second,
	}
}

// 获取针对某个数据库的连接
// db默认值为0
func GetConn(db int) (con redis.Conn, err error) {
	con = RedisClient.Get()
	if _, err := con.Do("SELECT", db); err != nil {
		con.Close()
		return nil, err
	}
	return con, nil
}

func SetValue(key, value string, db int) error {
	con := RedisClient.Get()
	if _, err := con.Do("SELECT", db); err != nil {
		con.Close()
		fmt.Println(err.Error())
		return err
	}
	_, err := con.Do("SET", key, value)
	return err
}

// 取值字符串
func GetValueString(key string, db int) (string, error) {
	con := RedisClient.Get()
	if _, err := con.Do("SELECT", db); err != nil {
		con.Close()
		fmt.Println(err.Error())
		return "", err
	}
	replay, err := con.Do("GET", key)
	if err != nil {
		return "", err
	}
	if nil == replay {
		return "", nil
	}
	return fmt.Sprintf("%s", replay), err
}

// 判断Key是否在指定的数据库中存在
func Exists(key string, db int) (bool, error) {
	con := RedisClient.Get()
	if _, err := con.Do("SELECT", db); err != nil {
		con.Close()
		fmt.Println(err.Error())
		return false, err
	}
	replay, err := con.Do("EXISTS", key)
	if err != nil {
		return false, err
	}
	if replay.(int) != 1 {
		return false, nil
	}
	return true, nil
}

// 增长计数
func Incr(key string, db int) error {
	con := RedisClient.Get()
	if _, err := con.Do("SELECT", db); err != nil {
		con.Close()
		fmt.Println(err.Error())
		return err
	}
	exis, err := Exists(key, db)
	if err != nil {
		return err
	}
	if !exis {
		con.Do("SET", key, 0);
	}
	_, err = con.Do("INCR", key)
	return err
}

// 减少计数
func Decr(key string, db int) error {
	con := RedisClient.Get()
	if _, err := con.Do("SELECT", db); err != nil {
		con.Close()
		fmt.Println(err.Error())
		return err
	}
	exis, err := Exists(key, db)
	if err != nil {
		return err
	}
	if !exis {
		return errors.New("不存在的KEY")
	}
	_, err = con.Do("DECR", key)
	return err
}
